function foo(x, y) {
  console.log(this.a, x, y);
  return x + y
}
const obj = {
  a: 1
}
// foo.call(obj, 2)


//call 的实现原理
Function.prototype.myCall = function (...args) {
  //将 foo 引用到 obj 上
  //让 obj 调用 foo
  //移除 obj 上的 foo
  const context = args[0]//obj
  const arg = args.splice(1)//obj后面的参数
  context.fn = this//因为myCall被foo调用所以根据隐式绑定，myCall中的this指向foo
  const res = context.fn(...arg)//函数最后可能会有return
  delete context.fn
  return res
}

let res = foo.myCall(obj, 1, 2)
console.log(res);
